/headers
/headers/enums
DataDirectoryKind.ts
DllCharacteristics.ts
ImageCharacteristics.ts
MZSignature.ts
Machine.ts
PEMagic.ts
PESignature.ts
SectionCharacteristics.ts
Subsystem.ts
AddressRange.ts
DosHeader.ts
OptionalHeader.ts
PEHeader.ts
SectionHeader.ts
/imports
/imports/knockout
knockout-3.0.0.js
/layout
pe.css
pefile.html
/sample
sample.js
/typings
knockout.d.ts
LoaderContext.ts
PEFile.ts
io.ts
pe.html
pe.ts
x
17
  export module LoaderContext {
18
 
19
    /*
20
     * State of reading a particular PE file.
21
     */
22
    export class FileReader {
23
      expectedSize: number;
24
      peFile: PEFile;
25
 
26
      private _parsePhase: number = 0;
27
 
28
      constructor(public context: LoaderContext, path: string) {
29
          this.peFile = new PEFile(path);
30
          this.expectedSize = pe.headers.DosHeader.byteSize/4;
31
      }
32
 
33
      parseNext(buffer: Uint32Array, offset: number, size: number): number {
34
 
35
        while (true) {
36
 
37
          switch (this._parsePhase) {
38
            case 0:
39
              if (size < pe.headers.DosHeader.byteSize/4)
40
                return 0;
41
 
42
              this.peFile.dosHeader = new pe.headers.DosHeader();
43
              this.peFile.dosHeader.populateFromUInt32Array(buffer, offset);
44
              var readCount = pe.headers.DosHeader.byteSize/4;
45
 
46
              this.expectedSize = (this.peFile.dosHeader.lfanew - pe.headers.DosHeader.byteSize)/4;
47
 
48
              if (this.expectedSize<=0) {
49
                this._parsePhase = 2;
50
                readCount += this.expectedSize;
51
                this.expectedSize = pe.headers.PEHeader.byteSize/4;
52
              }
53
              else {
54
                this._parsePhase = 1;
55
              }
56
 
57
              return readCount;
58
  
59
            case 1:
60
              var stubSize = (this.peFile.dosHeader.lfanew - pe.headers.DosHeader.byteSize)/4;
61
 
62
              if (size < stubSize)
63
                return 0;
64
 
65
              try {
66
                this.peFile.dosStub = new Uint32Array(stubSize);
67
              }
68
              catch (error) {
69
                this.peFile.dosStub = <any>[];
70
              }
71
              for (var i = 0; i < stubSize; i++) {
72
                this.peFile.dosStub[i] = buffer[offset+i];
73
              }
74
              this.expectedSize = pe.headers.PEHeader.byteSize/4;
75
              return stubSize;
76
              
77
            case 2:
78
              if (size < pe.headers.PEHeader.byteSize/4)
79
                return 0;
80
              
81
              this.peFile.peHeader = new pe.headers.PEHeader();
82
              this.peFile.peHeader.populateFromUInt32Array(buffer, offset);
83
              this._parsePhase = 3;
84
              break;
85
 
86
            case 3:
87
              if (size < 1)
88
                return 0;
89
 
90
              var magic = buffer[offset];
91
              var expectedSize = magic === headers.PEMagic.NT32 ? headers.OptionalHeader.coreSize32 : headers.OptionalHeader.coreSize64;
92
 
93
              if (size < expectedSize)
94
                return 0;
95
 
96
              this.peFile.optionalHeader = new pe.headers.OptionalHeader();
97
              this.peFile.optionalHeader.populateCoreFromUInt32Array(buffer, offset);
98
              break;
99
              
100
          }
101
          throw new Error("Fallen through.");
102
        }
103
      }
104
    }